//
//  HMUserAccountViewModel.swift
//  Weibo24
//
//  Created by apple on 17/3/29.
//  Copyright © 2017年 itheima. All rights reserved.
//

import UIKit
//  OAuth登录相关接口封装
class HMUserAccountViewModel: NSObject {
    //  单例的全局访问点
    static let sharedViewModel: HMUserAccountViewModel = HMUserAccountViewModel()
    //  重写init构造函数
    //  构造函数私有化'private'
    private override init() {
        super.init()
        //  获取本地归档的对象
        userAccount = HMUserAccount.loadUserAccount()
    }
    
    //  viewModel引用模型
    var userAccount: HMUserAccount?
    
    //  封装获取accessToken的逻辑
    var accessToken: String? {
            //  获取过期时间对象
        if userAccount?.expiresDate?.compare(Date()) == ComparisonResult.orderedDescending {
            //  如果过期时间大于当前时间,表示没有过期
            return userAccount?.access_token
        }
        
        return nil

    }
    //  封装是否登录的操作
    var isLogin: Bool {
        return accessToken != nil
    }
    
    //   把网络请求, 获取acccessToken逻辑处理,抽取到ViweModel中
    //  通过code获取accesstoken
    //  private 表示只能在类内部使用,fileprivate表示也是私有,但是可以在extension里面,但是都不能在外界访问这个方法
    func requestAccessToken(code: String, callBack: @escaping (Bool)->()) {
        
        HMNetworkTools.sharedTools.requestAccessToken(code: code) { (response, error) in
            if error != nil {
                print("网络请求异常: \(error!)")
                //  数据的回调
                callBack(false)
                return
            }
            
            guard let dic = response as? [String: Any] else {
                print("服务端数据格式不对")
                callBack(false)
                return
            }
            //  代码执行到此表示oc对象(字典或者数组)
            print(dic)
            let userAccount = HMUserAccount(dic: dic)
            //  通过uid 和 accesstoken获取用户数据
            self.requesUserInfo(userAccount: userAccount, callBack: callBack)
            
        }
        
        
    }
    
    //  通过accessToken和uid获取用户新
    fileprivate func requesUserInfo(userAccount: HMUserAccount, callBack: @escaping (Bool)->()) {
        //  获取令牌
        let accessToken = userAccount.access_token!
        //  用户id
        let uid = userAccount.uid
        HMNetworkTools.sharedTools.requestUserInfo(accessToken: accessToken, uid: uid) { (response, error) in
            if error != nil {
                print("网络请求异常: \(error!)")
                callBack(false)
                return
            }
            
            guard let dic = response as? [String: Any] else {
                print("服务端数据格式不对")
                callBack(false)
                return
            }
            
            //  代码执行到此字典一定有值
            print(dic)
            
            //  给对象里面的name和头像赋值
            let name = dic["name"] as? String
            let avatar_large = dic["avatar_large"] as? String
            userAccount.name = name
            userAccount.avatar_large = avatar_large
            
            //  保存用户对象
            userAccount.saveUserAccount()
            //  给属性赋值
            self.userAccount = userAccount
            //  获取到用户信息并且归档完成表示登录成功
            callBack(true)
        }
        
    }
}
